package serverStuff;

import java.rmi.AlreadyBoundException;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
import java.rmi.server.UnicastRemoteObject;
import java.util.HashMap;

public class Server implements IServices {
	private Biblioteca biblioteca;

	public Server() {
		this.biblioteca = new Biblioteca();
	}

	@Override
	public ServerReply getBookInfo(String ISBN) throws RemoteException {
		long nanoTime = System.nanoTime();
		if (this.biblioteca.livros.containsKey(ISBN)) {
			StringBuilder strBuilder = new StringBuilder();
			HashMap<String, Livro> livros = this.biblioteca.livros;

			strBuilder.append("Título: " + livros.get(ISBN).titulo + System.lineSeparator());
			strBuilder.append("Autores: " + livros.get(ISBN).autores + System.lineSeparator());
			strBuilder.append("Editora: " + livros.get(ISBN).editora + System.lineSeparator());
			strBuilder.append("ISBN: " + livros.get(ISBN).ISBN + System.lineSeparator());
			strBuilder.append("Ano: " + livros.get(ISBN).ano + System.lineSeparator());
			strBuilder.append("Descrição: " + livros.get(ISBN).descricao + System.lineSeparator());
			strBuilder.append("Exemplares em estoque: " + livros.get(ISBN).exemplares + System.lineSeparator());

			return new ServerReply(nanoTime, strBuilder.toString());
		} else {
			return new ServerReply(nanoTime, "ISBN não encontrado.");
		}
	}

	@Override
	public ServerReply getAllTitleAndISBN() throws RemoteException {
		long nanoTime = System.nanoTime();
		StringBuilder resposta = new StringBuilder() ;
		
		for (Livro livro : biblioteca.getAllBooks()) {
			resposta.append("ISBN: " + livro.ISBN+System.lineSeparator());
			resposta.append("Título: " + livro.titulo+System.lineSeparator());
		}


		return new ServerReply(nanoTime, resposta.toString());
	}

	@Override
	public ServerReply getDescription(String ISBN) throws RemoteException {
		long nanoTime = System.nanoTime();

		if (this.biblioteca.livros.containsKey(ISBN)) {
			HashMap<String, Livro> livros = this.biblioteca.livros;
			String retorno = "Descrição: ";
			retorno += livros.get(ISBN).descricao + System.lineSeparator();
			return new ServerReply(nanoTime, retorno);
		} else {
			return new ServerReply(nanoTime, "ISBN não encontrado.");
		}
	}

	@Override
	public ServerReply getAllInformation() throws RemoteException {
		long nanoTime = System.nanoTime();
		StringBuilder strBuilder = new StringBuilder();

		for (Livro livro : biblioteca.getAllBooks()) {
			strBuilder.append("Título: " + livro.titulo + System.lineSeparator());
			strBuilder.append("Autores: " + livro.autores + System.lineSeparator());
			strBuilder.append("Editora: " + livro.editora + System.lineSeparator());
			strBuilder.append("ISBN: " + livro.ISBN + System.lineSeparator());
			strBuilder.append("Ano: " + livro.ano + System.lineSeparator());
			strBuilder.append("Descrição: " + livro.descricao + System.lineSeparator());
			strBuilder.append("Exemplares em estoque: " + livro.exemplares + System.lineSeparator());
			strBuilder.append(System.lineSeparator());
		}

		return new ServerReply(nanoTime, strBuilder.toString());
	}

	@Override
	public ServerReply getBookAmount(String ISBN) throws RemoteException {
		long nanoTime = System.nanoTime();
		HashMap<String, Livro> livros = this.biblioteca.livros;
		if (this.biblioteca.livros.containsKey(ISBN)) {
			return new ServerReply(nanoTime, new Integer(livros.get(ISBN).exemplares).toString() + System.lineSeparator());
		} else {
			return new ServerReply(nanoTime, "ISBN não encontrado");
		}
	}

	@Override
	public ServerReply updateBookAmount(String ISBN, int amount, ClientType type)
			throws RemoteException {
		long nanoTime = System.nanoTime();
		if (type == ClientType.Library) {
			if (this.biblioteca.livros.containsKey(ISBN)) {
				this.biblioteca.livros.get(ISBN).exemplares = amount;
				return new ServerReply(nanoTime, "Quantidade atualizada com sucesso" + System.lineSeparator());
			}else{
				return new ServerReply(nanoTime, "ISBN não encontrado" + System.lineSeparator());
			}
		} else {
			return new ServerReply(nanoTime, "Apenas a livraria pode atualizar o número de exemplares" + System.lineSeparator());
		}
	}

	public static void main(String[] args) {

		try {
			Server obj = new Server();
			IServices stub = (IServices) UnicastRemoteObject.exportObject(obj,
					0);

			// Bind the remote object's stub in the registry
			LocateRegistry.createRegistry(1099);

			Registry registry = LocateRegistry.getRegistry();
			registry.bind("IServices", stub);

			System.out.println("O Server está pronto para receber solicitações");

		} catch (AlreadyBoundException e) {
			e.printStackTrace();
		} catch (RemoteException e) {
			e.printStackTrace();
		}
	}

}
